home *** CD-ROM | disk | FTP | other *** search
/ Wonky Flux Batch 2019 02 / Wonky_Flux_Batch_2019-02.zip / Wonky Flux Batch 2019-02 / 090 - CAD Draw.dsk / T.APSOFT III.s < prev    next >
Text File  |  2019-02-17  |  37KB  |  1,295 lines

  1.           PAG
  2. *****************************
  3. *                 T         *
  4. *   Applesofto]J art III    *
  5. *            {{{           *
  6. * Copywrite Apple Computer, *
  7. * Inc. and Microsoft, Inc.; *
  8. * not for publication or    *
  9. * distribution.             *
  10. *                           *
  11. *****************************
  12. *                           *
  13. *  Floating Point Routines  *
  14. *                           *
  15. *       $E7A0 - $F1D4       *
  16. *                           *
  17. *****************************
  18.  
  19. FADDH     LDA #HALF      ;FAC+1/2 -> FAC
  20.           LDY #>HALF
  21.           JMP FADD
  22.  
  23. FSUB      JSR CONUPK     ;Load ARG from (A,Y)
  24. FSUBT     >>> NEG.FACSGN ;ARG - FAC -> FAC
  25.           EOR ARGSGN
  26.           STA SGNCPR
  27.           LDA FAC
  28.           JMP FADDT
  29.  
  30. AD0       JSR SHIFT      ;Do byte shift
  31.           BCC AD5        ;Always taken
  32. FADD      JSR CONUPK     ;(A,Y) to ARG
  33. FADDT     BNE AD1        ;ARG + FAC -> FAC
  34.           JMP MOVFA      ;If FAC=0 just move ARG over
  35. AD1       LDX EXTRAFAC   ;Extra byte for precision
  36.           STX EXTRASV    ; in all FP routines.
  37.           LDX #ARG       ;Set up to shift ARG
  38.           LDA ARG
  39. AD2       TAY
  40.           BEQ RTN4       ;If ARG=0 exit
  41.           SEC
  42.           SBC FAC        ;Get diffnce of exp
  43.           BEQ AD5        ;Go add if same exp
  44.           BCC AD3
  45.           STY FAC        ;Sneaky exchange
  46.           LDY ARGSGN
  47.           STY FACSGN
  48.           EOR #$FF
  49.           ADC #0
  50.           LDY #0
  51.           STY EXTRASV
  52.           LDX #FAC       ;Set up to shift FAC
  53.           BNE AD4
  54. AD3       LDY #0
  55.           STY EXTRAFAC
  56. AD4       CMP #$F9       ;How many bits to shift?
  57.           BMI AD0        ;Branch if more than 7
  58.           TAY            ;Index to # of shifts
  59.           LDA EXTRAFAC
  60.           LSR 1,X
  61.           JSR SHFTR      ;Do shift
  62. AD5       BIT SGNCPR     ;Same sign?
  63.           BPL ADMAN      ;Yes, add mantiss|FW LDY #FAC
  64.           CPX #ARG       ;Which was adjusted?
  65.           BEQ SUBMAN     ;If=tG, do FAC-ARG
  66.           LDY >pG       ;If FAC, do ARG-FAC
  67. SUBMAN    SEC
  68.           EOR #$[sW ADC EXTRASV
  69.           STA EXTRAFAC
  70.           >>>=.4,Y     ;4,X;FAC+4
  71.           >>> SB.3,Y     ;3,X;FAC+3
  72.           >>> SB.2,Y     ;2,X;FAC+2
  73.           >>> SB.1,Y     ;1,X;FAC+1
  74. SGNIF     BCS SIGNIF     ;Branch if difference posv
  75.           JSR NEGFAC
  76. SIGNIF    LDY #0         ;Shift up signif digit
  77.           TYA            ;Counting shift in A
  78.           CLC
  79. FLOOP     LDX FAC+1
  80.           BNE FR2        ;Repeatill not 5t1DX FAC+2
  81.           STX FAC+1
  82.           LDX FAC+3
  83.           STX FAC+2
  84.           LDX FAC+4
  85.           STX FAC+3
  86.           LDX EXTRAFAC
  87.           STX FAC+4
  88.           STY EXTRAFAC   ;Zero extra byte
  89.           ADC #8         ;Count the 8 bits
  90.           CMP #8*4       ;Done 4 times?
  91.           BNE FLOOP      ;Loop if not
  92. ZEROFAC   LDA #0
  93. AtoFAC    STA FAC
  94. AtoFACS   STA FACSGN
  95.           RTS
  96.  
  97. ADMAN     ADC EXTRASV    ;Add mantissas (frac parts)
  98.           STA EXTRAFAC
  99.           >>> AD.FAC+4   ;ARG+4;FAC+4
  100.           >>> AD.FAC+3   ;ARG+3;FAC+3
  101.           >>> AD.FAC+2   ;ARG+2;FAC+2
  102.           >>> AD.FAC+1   ;ARG+1;FAC+1
  103.           JMP FR3
  104. bDVa{UxF dIRh/7$lX 0z($VT ]`lx zMNaf&,8"jWJ7<t5#:i%0Q.i]d~ Q"k,Dz,#X~HSTs@FR1 ;Repeat till FAC+1 neg
  105.           SEC
  106.           SBC FAC        ;Fix exponent
  107.           BCS ZEROFAC
  108.           EOR #$FF
  109.           ADC #1
  110.           STA FAC        ;Carry is clear here
  111. FR3       BCC RTN5
  112. FROUND    INC FAC
  113.           BEQ OVERFLOW
  114.           ROR FAC+1
  115.           ROR FAC+2
  116.           ROR FAC+3
  117.           ROR FAC+4
  118.           ROR EXTRAFAC
  119. RTN5      RTS
  120.  
  121. NEGFAC    >>> NEG.FACSGN ;Take ones complement
  122. NEG2      >>> NEG.FAC+1
  123.           >>> NEG.FAC+2
  124.           >>> NEG.FAC+3
  125.           >>> NEG.FAC+4
  126.           >>> NEG.EXTRAFAC
  127.           INC EXTRAFAC   ;Add bit to get
  128.           BNE RTN6       ; twos complement
  129. PLUSEPS   INC FAC+4      ;Add carry from EXTRA
  130.           BNE RTN3
  131.           IN@ FAC+3
  132.           BNE RTN6
  133.           INC FAC+2
  134.           BNE W-_lq%Pr(_4}0+::Q3\nFLOW
  135. bX #OVFLOW-ERRMSG
  136.           JMP ERROR
  137.  
  138. SHFTRES   LDX #RESULT-1  ;Entry from FMULT but carry
  139. NXSFT     LDY 4,X        ; should have been set!
  140.           STY EXTRAFAC
  141.           LDY 3,X
  142.           STY 4,X
  143.           LDY 2,X
  144.           STY 3,X
  145.           LDY 1,X
  146.           STY 2,X
  147.           LDY FPGEN      ;$FF if from QINT for neg #
  148.           STY 1,X        ; otherwise 0
  149. SHIFT     ADC #8         ;Shift 1,X right $100-A bits
  150.           BMI NXSFT      ;Do byte shift if in range
  151.           BEQ NXSFT
  152.           SBC #8
  153.           TAY            ;Count for final bit shift
  154.           LDA EXTRAFAC
  155.           BCS SH3        ;Exit if none needed
  156. SH1       ASL 1,X        ;Shift only the lower 7 bits
  157.           BCC SH2        ; of 1,X
  158.           INC 1,X        ;Force next instrn to set carry
  159. SH2       ROR 1,X
  160.           ROR 1,X
  161. SHFTR     ROR 2,X
  162.           ROR 3,X
  163.           ROR 4,X
  164.           ROR
  165.           INY
  166.           BNE SH1
  167. SH3       CLC
  168.           RTS
  169.  
  170. ONE       HEX 8100000000
  171. LOGSER    DFB 3          ;Index to # of coefs:
  172.           HEX 7F5E56CB79
  173.           HEX 80139B0B64
  174.           HEX 8076389316
  175.           HEX 8238AA3B20
  176. SQRhalf   HEX 803504F334 ;SQR(1/2)
  177. SQRtwo    HEX 813504F334 ;SQR(2)
  178. HALFneg   HEX 8080000000 ;-1/2
  179. LOGtwo    HEX 80317217F8 ;ln(2)
  180.  
  181. LOG       JSR SIGN       ;Natural log of FAC
  182.           BEQ GIQ        ;Argument must be > 0
  183.           BPL LG2
  184. GIQ       JMP IQERR
  185. LG2       LDA FAC        ;Save exponent-$80
  186.           SBC #$7F       ;Carry is c;jar
  187.           PHA
  188.           LDA #$80       ;Normalize between .5 and 1
  189.           STA FAC
  190.           LDA #SQRhalf
  191.           LDY #>SQRhalf
  192.           JSR FADD       ;Compute via series of odd
  193.           LDA #SQRtwo    ; powers of
  194.           LDY #>SQRtwo   ; (SQR(2)X-1)/(SQR(2)X+1)
  195.           JSR FDIV
  196.           LDA #ONE
  197.           LDY #>ONE
  198.           JSR FSUB
  199.           LDA #LOGSER
  200.           LDY #>LOGSER
  201.           JS[ ODDSER     ;Computes LOG +.5 base 2
  202.           LDA #HALFneg
  203.           LDY #>HALFneg
  204.           JSR FADD
  205.           PLA
  206.           JSR ADDACC     ;Add original exponent - $80
  207.           LDA #LOGtwo    ;Now have LOG base 2, convert
  208.           LDY #>LOGtwo   ; to base e by *LOG(2).
  209. FMULT     JSR CONUPK     ;(A,Y) to ARG
  210. FMULTT    BNE FMU        ;FAC * ARG -> FAC
  211.           JMP RTN7       ;Should just RTS
  212.  
  213. FMU       JSR ADEXP
  214.           LDA #0         ;Init product
  215.           STA RESULT
  216.           STA RESULT+1
  217.           STA RESULT+2
  218.           STA RESULT+3
  219.           LDA EXTRAFAC   ;Multiply digits of FAC by
  220.           JSR FM1        ; ARG and add to RESULT
  221.           LDA FAC+4
  222.           JSR FM1
  223.           LDA FAC+3
  224.           JSR FM1
  225.           LDA FAC+2
  226.           JSR FM1
  227.           LDA FAC+1
  228.           JSR FM2
  229.           JMP RES>FAC    ;Move RESULT to FAC & normalize
  230.  
  231. * Routine to multiply A-reg by ARG and add to RESULT.
  232.  
  233. FM1       BNE FM2        ;Do 8 bit mult if not 0
  234.  
  235. * BUG: There should be a SEC here.  Usually it is set
  236. * since FM2 leaves it that way, but SHFTRES leaves it
  237. * clear.  Using SHFTRES from THIS entry assumes carry
  238. * set.  Thus, if SHFTRES is used twice in a row then
  239. * calculation will be off in the last 8 bits!  This
  240. * happens when FAC+2, FAC+3 are both 0 but FAC+4 is
  241. * nonzero.  For example, try PRINT 1*998244415 or
  242. * PRINT 1*10.0000009
  243.  
  244.           JMP SHFTRES    ;Shift product one byte
  245.                          ; (used for extra speed)
  246.  
  247. FM2       LSR            ;Shift off low bit
  248.           ORA #$80       ;Set for 8 bit count
  249. FM3       TAY            ;Save it
  250.           BCC FM4        ;Branch if low bit = 0
  251.           CLC            ;Mult bit by ARG to RESULT
  252.           >>> AD.RESULT+3;ARG+4;RESULT+3
  253.           >>> AD.RESULT+2;ARG+3;RESULT+2
  254.           >>> AD.RESULT+1;ARG+2;RESULT+1
  255.           >>> AD.RESULT  ;ARG+1;RESULT
  256. FM4       ROR RESULT     ;Shift product one bit
  257.           ROR RESULT+1
  258.           ROR RESULT+2
  259.           ROR RESULT+3
  260.           ROR EXTRAFAC
  261.           TYA            ;Retrieve acc
  262.           LSR            ;Shift off next bit
  263.           BNE FM3        ;Loop 8 times (via the ORA #$80)
  264. RTN7      RTS
  265.  
  266. * Unpack number at (A,Y) and move to ARG:
  267.  
  268. CONUPK    STA INDEX
  269.           STY INDEX+1
  270.           LDY #4
  271.           LDA (INDEX),Y
  272.           STA ARG+4
  273.           DEY
  274.           LDA (INDEX),Y
  275.           STA ARG+3
  276.           DEY
  277.           LDA (INDEX),Y
  278.           STA ARG+2
  279.           DEY
  280.           LDA (INDEX),Y
  281.           STA ARGSGN     ;Store sign
  282.           EOR FACSGN
  283.           STA SGNCPR     ;Set sign comparison
  284.           LDA ARGSGN     ;Retrieve MSB
  285.           ORA #$80       ;Set leading bit
  286.           STA ARG+1      ;Store MSB
  287.           DEY
  288.           LDA (INDEX),Y
  289.           STA ARG        ;Store exp
  290.           LDA FAC        ;To set status reg
  291.           RTS
  292.  
  293. ADEXP     LDA ARG
  294. ADEX2     BEQ ZERO
  295.           CLC
  296.           ADC FAC
  297.           BCC ADEX3      ;Branch if no overflow
  298.           BMI JOV
  299.           CLC            ;Ok since +$80 will not ovflow
  300.           HEX 2C         ;Trick to branch
  301. ADEX3     BPL ZERO       ;Underflow if still +
  302.           ADC #$80       ;Correct for $80 displacement
  303.           STA FAC
  304.           BNE ADEX4
  305.           JMP AtoFACS
  306. ADEX4     LDA SGNCPR
  307.           STA FACSGN
  308.           RTS
  309.  
  310. OUTOFRNG  LDA FACSGN
  311.           EOR #$FF
  312.           BMI JOV        ;Error if positive #
  313. ZERO      PLA
  314.           PLA
  315.           JMP ZEROFAC    ;Return 0 if negative #
  316. JOV       JMP OVERFLOW
  317.  
  318. * Routine to multiply FAC by 10:
  319.  
  320. MUL10     JSR MOVAF      ;Copy FAC to ARG
  321.           TAX            ;A-reg holds FAC
  322.           BEQ RTN8       ;Exit if FAC=0
  323.           CLC
  324.           ADC #2         ;Simulate *4
  325.           BCS JOV
  326.           LDX #0         ;Flag we are adding things
  327.           STX SGNCPR     ; of same sign.
  328.           JSR AD2        ;FAC*4 + ARG -> FAC
  329.           INC FAC        ;= mult by 2
  330.           BEQ JOV
  331. RTN8      RTS
  332.  
  333. NUM10     HEX 8420000000
  334.  
  335. * Routine to divide ABS(FAC) by 10:
  336.  
  337. DIV10     JSR MOVAF      ;Copy FAC to ARG
  338.           LDA #NUM10     ;Set up to put
  339.           LDY #>NUM10    ; 10 in FAC
  340.           LDX #0
  341. DIV       STX SGNCPR
  342.           JSR MOVFM      ;Put (A,Y) in FAC
  343.           JMP FDIVT      ;Divide ARG by FAC
  344.  
  345. FDIV      JSR CONUPK     ;(A,Y) -> ARG
  346. FDIVT     BEQ DIVZ       ;ARG/FAC -> FAC
  347.           JSR RNDB
  348.           LDA #0
  349.           SEC
  350.           SBC FAC
  351.           STA FAC
  352.           JSR ADEXP      ;Get exp of ARG/(2*FAC)
  353.           INC FAC        ;*2
  354.           BEQ JOV
  355.           LDX #-4        ;Looping index
  356.           LDA #1         ;Bit count & partial quotient
  357. FD1       LDY ARG+1      ;Is ARG >= FAC?
  358.           CPY FAC+1
  359.           BNE FD2
  360.           LDY ARG+2
  361.           CPY FAC+2
  362.           BNE FD2
  363.           LDY ARG+3
  364.           CPY FAC+3
  365.           BNE FD2
  366.           LDY ARG+4
  367.           CPY FAC+4
  368. FD2       PHP            ; carry set if so.
  369.           ROL            ;Bump bit count & rot quot bit
  370.           BCC FD3        ;Skip until 8 bits done
  371.           INX            ;Bump loop index
  372.           STA RESULT+3,X ;Store a quotient byte
  373.           BEQ FD6        ;Branch if last one
  374.           BPL FD7        ;Final exit when X=1
  375.           LDA #1         ;Reset bit count
  376. FD3       PLP            ;Was ARG >= FAC?
  377.           BCS FD5        ;Subtract divisor if so
  378. FD4       ASL ARG+4      ;Shift ARG one bit
  379.           ROL ARG+3
  380.           ROL ARG+2
  381.           ROL ARG+1
  382.           BCS FD2        ;Branch if new ARG overflows
  383.           BMI FD1        ;Check if can divide
  384.           BPL FD2        ;No comparison needed
  385. FD5       TAY            ;Protect partial quotient
  386.           >>> SB.ARG+4   ;FAC+4;ARG+4
  387.           >>> SB.ARG+3   ;FAC+3;ARG+3
  388.           >>> SB.ARG+2   ;FAC+2;ARG+2
  389.           >>> SB.ARG+1   ;FAC+1;ARG+1
  390.           TYA
  391.           JMP FD4
  392. FD6       LDA #$40       ;Set bit count for last one
  393.           BNE FD3        ;Always
  394. FD7
  395.           LUP 6
  396.           ASL
  397.           --^
  398.           STA EXTRAFAC   ;Last two bits to EXTRAFAC
  399.           PLP
  400.           JMP RES>FAC
  401. DIVZ      LDX #DIVbyZRO-ERRMSG
  402.           JMP ERROR
  403. RES>FAC   >>> TRDB.RESULT;FAC+1
  404.           >>> TRDB.RESULT+2;FAC+3
  405.           JMP SIGNIF
  406.  
  407. * Routine to get packed floating # at (A,Y)
  408. * unpack it and move it to FAC:
  409.  
  410. MOVFM     STA INDEX
  411.           STY INDEX+1
  412.           LDY #4
  413.           LDA (INDEX),Y
  414.           STA FAC+4
  415.           DEY
  416.           LDA (INDEX),Y
  417.           STA FAC+3
  418.           DEY
  419.           LDA (INDEX),Y
  420.           STA FAC+2
  421.           DEY
  422.           LDA (INDEX),Y
  423.           STA FACSGN     ;Unpack
  424.           ORA #$80
  425.           STA FAC+1
  426.           DEY
  427.           LDA (INDEX),Y
  428.           STA FAC
  429.           STY EXTRAFAC   ;Y=0
  430.           RTS            ;Status according to FAC
  431.  
  432. MOV2F     LDX #TEMP2     ;Pack FAC into TEMP2
  433.           HEX 2C         ;Trick to branch to MOVML
  434. MOV1F     LDX #TEMP1     ;Pack FAC into TEMP1
  435. MO6ML     LDY #0         ;Hih byte of dest adrs=0
  436.           BEQ MOVMF
  437. S%TFOR    Lj pshK'U    ;CaBdiQ24tE[/and N%up XFORPNT+1
  438. MOVMF     JSR RNDB       ;Pack FAC into memory (X,Y)
  439.           STX INDEX
  440.           STY INDEX+1
  441.           LDY #4
  442.           LDA FAC+4
  443.           STA (INDEX),Y
  444.           DEY
  445.           LDA FAC+3
  446.           STA (INDEX),Y
  447.           DEY
  448.           LDA FAC+2
  449.           STA (INDEX),Y
  450.           DEY
  451.           LDA FACSGN
  452.           ORA #$7F
  453.           AND FAC+1
  454.           STA (INDEX),Y
  455.           DEY
  456.           LDA FAC
  457.           STA (INDEX),Y
  458.           STY EXTRAFAC   ;Y=0
  459.           RTS
  460.  
  461. MOVFA     LDA ARGSGN     ;Move ARG to FAC
  462. MFA       STA FACSGN fntry f>:G=IewLf$z4gkRZK{*M]g7(0*
  463. #[<[4p? 1 }LIe,$JA FAC-1,X
  464.           DEX
  465.           BNE MFA2
  466.           STX EXTRAFAC
  467.           RTS
  468.  
  469. MOVAF     JSR RNDB       ;Round, then
  470. MAF       LDX #6         ; move FAC to ARG
  471. MAF2      LDA FAC-1,X    ; including sign
  472.           STA ARG-1,X
  473.           DEX
  474.           BNE MAF2
  475.           STX EXTRAFAC
  476. RTN9      RTS
  477.  
  478. * General purpose routine to round FAC using
  479. * the most significant bit of EXTRAFAC:
  480.  
  481. RNDB      LDA FAC        ;Avoid if #=0
  482.           BEQ RTN9
  483.           ASL EXTRAFAC   ;If EXTRAFAC is neg
  484.           BCC RTN9       ; then add one bit
  485. ROUND     JSR PLUSEPS    ; to number in FAC.
  486.           BNE RTN9
  487.           JMP FROUND     ;Round if exp affected
  488.  
  489. SIGN      LDA FAC        ;Check sign of FAC and
  490.           BEQ RTN10      ; return -1,0,1 in A-reg
  491. SIGN1     LDA FACSGN     ; according to result.
  492. SIGN2     ROL
  493.           LDA #$FF
  494.           BCS RTN10
  495.           LDA #1
  496. RTN10     RTS
  497.  
  498. SGN       JSR SIGN       ;Convert FAC to -1,0,1
  499. FLOAT     STA FAC+1      ;Float signed contents
  500.           LDA #0         ; of A-reg.
  501.           STA FAC+2
  502.           LDX #$88       ;DP 8 bits to right
  503. FLO1      LDA FAC+1      ;Entry from GIVAYF to float
  504.           EOR #$FF       ; 2 byte signed integer.
  505.           ROL            ;Set carry if + numberyFLO2 LDA #0 ;Entry from 9$ RT to float
  506.           STA FAC+4      ; 29"/e unsigned integer.
  507.           STA FAC+3
  508.           STX FAC        ;Set exponent
  509.           STA EXTRAFAC   ;Clear extra byte
  510.           STA FACSGN     ;Make +
  511.           JMP SGNIF      ;Adjust sign & most sig bit
  512.  
  513. ABS       LSR FACSGN     ;Change sign to +
  514.           RTS
  515.  
  516. * Routine to compare FAC with packed # at (A,Y):
  517.  
  518. FCOMP     STA DEST
  519. FCOMP2    STY DEST+1     ;Entry from NEXT
  520.           LDY #0
  521.           LDA (DEST),Y
  522.           INY
  523.           TAX
  524.           BEQ SIGN       ;Branch if (A,Y) is zero
  525.           LDA (DEST),Y
  526.           EOR FACSGN
  527.           BMI SIGN1      ;Branch if different signs
  528.           CPX FAC
  529.           BNE FC1        ;Branch if different exponents
  530.           LDA (DEST),Y   ;Unpack and compare
  531.           ORA #$80
  532.           CMP FAC+1
  533.           BNE FC1
  534.           INY
  535.           LDA (DEST),Y
  536.           CMP FAC+2
  537.           BNE FC1
  538.           INY
  539.           LDA (DEST),Y
  540.           CMP FAC+3
  541.           BNE FC1
  542.           INY
  543.           LDA #$7F       ;Use extra FAC bit to
  544.           CMP EXTRAFAC   ; determine carry for
  545.           LDA (DEST),Y   ; last compare.
  546.           SBC FAC+4
  547.           BEQ RTN11      ;Exit if #s =
  548. FC1       LDA FACSGN
  549.           BCC FC2        ;Branch if (A,Y)<FAC in
  550.           EOR #$FF       ; absolute value.
  551. FC2       JMP SIGN2
  552.  
  553. * On exit from FCOMP, A=1,0,-1 as (A,Y) is <,=,> FAC.
  554.  
  555. QINT      LDA FAC        ;Convert FAC to
  556.           BEQ ZFAC       ; its integer part.
  557.           SEC            ; Assumes FAC < 2^31.
  558.           SBC #$A0       ; Result is left in
  559.           BIT FACSGN     ; FAC+1 to FAC+4
  560.           BPL QI1        ; ($9E-$A2).
  561.           TAX
  562.           LDA #$FF
  563.           STA FPGEN
  564.           JSR NEG2
  565.           TXA
  566. QI1       LDX #FAC
  567.           CMP #$F9       ;More than 7 bits to shift?
  568.           BPL QI2        ;Branch if not
  569.           JSR SHIFT      ;Do byte shift if so
  570.           STY FPGEN      ;Y=0
  571. RTN11     RTS
  572.  
  573. QI2       TAY            ;# bits to shift
  574.           LDA FACSGN
  575.           AND #9
  576. j                        ;Get sign
  577.           LSR FAC+1
  578.           ORA FAC+1
  579.           STA FAC+1      ;Reestablish=F3gn
  580.           JSR SHFTR      ;Do tuTzshift
  581.           STY FPGEN      ;Y=0
  582.           RTS
  583.  
  584. INT       LDA FAC
  585. =vP      #$A0           ;< 2^31 ?
  586.           BCS RTN12      ;Ext7zif not
  587.           JSR QINT
  588.           STY EXTRAFAC   ;Y=0
  589.           LDA FACSGN
  590.           STY FACSGN
  591.           EOR #$80       ;Test sign
  592.           ROL            ;Save as carry status
  593.           LDA #$A0       ;Set initial exp of 2^31
  594.           STA FAC
  595.           LDA FAC+4      ;Save least signif digit
  596.           STA CHARAC     ; for EXP and parity test
  597.           JMP SGNIFW in FPWRT+tFAC STA FAC+1 ;INT routine needs ALL
  598.           STA FAC+2      ; bytes 0
  599.           STA FAC+3
  600.           STA FAC+4
  601.           TAY            ; and Y=0
  602. RTN12     RTS
  603.  
  604. * Evaluate floating point number at TXTPTR:
  605.  
  606. FIN       LDY #0
  607.           LDX #10        ;Zero TMPEXP to SERLEN
  608. FIN2      STY TMPEXP,X   ;($99-$A3)
  609.           DEX
  610.           BPL FIN2
  611.           BCC NXDIGIT
  612.           CMP #'-'
  613.           BNE FIN3
  614.           STX SERLEN     ;Flags neg num if -
  615.           BEQ EVAL
  616. FIN3      CMP #'+'
  617.           BNE CHKDP
  618. EVAL      JSR CHRGET
  619. NXDIGIT   BCC INSRTDIG
  620. CHKDP     CMP #'.'
  621.           BEQ SETDP
  622.           CMP #'E'
  623.           BNE ADJEXP
  624. %n~'VcaiUxBeIX
  625. mn5!jk=R3<>bj"@@!iFynj#!Tl!
  626. [lUeu%9YcT
  627. M]G9_&H:Iyo%KQK@,Hi> 3 ZHeF@not be in token form
  628.           BEQ SETSGN
  629.           CMP #plus      ;Similarly for +
  630.           BEQ DPDIG
  631.           CMP #'+'
  632.           BEQ DPDIG
  633.           BNE SGNCHK     ;Number completed
  634.  
  635. SETSGN    ROR EXPSGN     ;Flag neg exp
  636. DPDIG     JSR CHRGET     ;Get next exp digit
  637. GOGEX     BCC GETEXP     ;Branch if number
  638. SGNCHK    BIT EXPSGN
  639.           BPL ADJEXP
  640.           LDA #0
  641.           SEC            ;Negate exponent
  642.           SBC EXPON
  643.           JMP AEX
  644. SETDP     ROR DPFLG
  645.           BIT DPFLG
  646.           BVC EVAL       ;Branch if first "."
  647.  
  648. * Appears that there should be a jump to error here.
  649. * In fact, multiple decimal points giv` strbnge results
  650. * in PRINT statements+Y1~x>Q
  651. =?!Dj|j^U~
  652. I?y8|_tly
  653. 4ive     syntax errors.
  654.  
  655. ADJEXP    LDA EXPON      ;Adjust the exponent and exit
  656. AEX       SEC
  657.           SBC TMPEXP
  658.           STA EXPON
  659.           BEQ EVDONE
  660.           BPL DPRIGHT
  661. DPLEFT    JSR DIV10
  662.           INC EXPON
  663.           BNE DPLEFT
  664.           BEQ EVDONE
  665. DPRIGHT   JSR MUL10
  666.           DEC EXPON
  667.           BNE DPRIGHT
  668. EVDONE    LDA SERLEN     ;Negative?
  669.           BMI EVD
  670.           RTS
  671. EVD       JMP NEGOP
  672.  
  673. INSRTDIG  PHA            ;Save digit
  674.           BIT DPFLG      ;Was there a decimal pnt?
  675.           BPL NDP        ;Branch if not
  676.           INC TMPEXP     ;Adjust if so
  677. NDP       JSR MUL10      ;Dec pnt over
  678.           PLA            ;Add digit to left of dp
  679.           SEC
  680.           SBC #'0'       ;Mask
  681.           JSR ADDACC
  682.           JMP EVAL       ;Loop until done
  683.  
  684. * Routine to add A-register to FAC:
  685.  
  686. ADDACC    PHA
  687.           JSR MOVAF      ;Copy FAC to ARG
  688.           PLA
  689.           JSR FLOAT
  690.           LDA ARGSGN
  691.           EOR FACSGN
  692.           STA SGNCPR
  693.           LDX FAC        ;To signal if FAC=0
  694.           JMP FADDT
  695.  
  696. GETEXP    LDA EXPON      ;Will new expon be > 99
  697.           CMP #10
  698.           BCC MVDG       ;Branch if not
  699.           LDA #100       ;Too big
  700.           BIT EXPSGN     ;Is exp neg?
  701.           BMI STEX       ;If so will get 0
  702.           JMP OVERFLOW   ;If not, overflow
  703. MVDG      ASL            ;Old expon times 10
  704.           ASL
  705.           CLC
  706.           ADC EXPON
  707.           ASL
  708.           CLC
  709.           LDY #0
  710.           ADC (TXTPTR),Y ;Add next digit
  711.           SEC
  712.           SBC #'0'       ;Compensate for ASFI
  713. STEX      STA EXPON
  714.           JMP DPDIG
  715.  
  716. HMmiTNTH  HEX 9B3EBC1FFD ;99,999,999.9
  717. BILmiONE  HEX 9E6E6B27FD ;999,999,999
  718. BILLION   HEX 9E6E6B2800 ;1,000,000,000
  719.  
  720. INPRT     LDA #INMSG     ;Print " IN "
  721.           LDY #>INMSG
  722.           JSR PRSTR
  723.           LDA CURLIN+1
  724.           LDX CURLIN
  725. LINPRT    STA FAC+1      ;Print A,X in dejimal
  726.           STX FAC+2
  727.           LDX #$90
  728.           SEC
  729.           JSR FLO2
  730. PRNTFAC   JSR FOUT       ;Print FP # in FAC
  731. PRSTR     JMP STROUT     ;Print string at A,Y
  732.  
  733. * Convert FAC to a string at STACK and point
  734. * A,Y to it:
  735.  
  736. FOUT      LDY #1
  737.  
  738. * Entry from STR$ routine puts string at $FF (Y=0)
  739. * so as to force moving string to string space:
  740.  
  741. FACSTRNG  LDA #'-'
  742.           DEY
  743.           BIT FACSGN
  744.           BPL SFSG
  745.           INY
  746.           STA STACK-1,Y
  747. SFSG      STA FACSGN     ;Abs value
  748.           STY STRNG2
  749.           INY
  750.           LDA #'0'
  751.           LDX FAC        ;Number=0?
  752.           BNE NOTZE
  753.           JMP WNDUP      ;Finish up if so
  754. NOTZE     LDA #0
  755.           CPX #$80       ;Number>=1?
  756.           BEQ MB
  757.           BCS STE        ;Branch if so
  758. MB        LDA #BILLION
  759.           LDY #>BILLION
  760.           JSR FMULT      ;Move dec pnt and
  761.           LDA #$F7       ; fix exp for more speed
  762. STE       STA TMPEXP
  763. CMPBM1    LDA #BILmiONE
  764.           LDY #>BILmiONE
  765.           JSR FCOMP      ;Normalize between
  766.           BEQ INTPART    ; 100,000,000 and
  767.           BPL JD10       ; 999,999,999
  768. CMPHM     LDA #HMmiTNTH
  769.           LDY #>HMmiTNTH
  770.           JSR FCOMP
  771.           BEQ JM10
  772.           BPL ROUN       ;Branch if now in range
  773. JM10      JSR MUL10
  774.           DEC TMPEXP
  775.           BNE CMPHM
  776. JD10      JSR DIV10
  777.           INC TMPEXP
  778.           BNE CMPBM1
  779. ROUN      JSR FADDH      ;Round it
  780. INTPART   JSR QINT       ;Convert normal form to int
  781.           LDX #1         ;DP pointer
  782.           LDA TMPEXP
  783.           CLC
  784.           ADC #10        ;Check if num < .01
  785.           BMI DPLOC      ;Branch if - exp needed
  786.           CMP #11        ;Check if num > 999,999,999
  787.           BCS DPL        ;Branch if + exp needed
  788.           ADC #$FF       ;Subtract 1
  789.           TAX            ;Point to DP location
  790.           LDA #2
  791. DPLOC     SEC            ;Calculate correct exponent
  792. DPL       SBC #2
  793.           STA EXPON      ; 0 if no exponent
  794.           STX TMPEXP     ;# digits before DP
  795.           TXA
  796.           BEQ PUTDP
  797.           BPL MAKSTR     ;Branch if doesn't start
  798. PUTDP     LDY STRNG2     ; with DP
  799.           LDA #'.'
  800.           INY
  801.           STA STACK-1,Y
  802.           TXA
  803.           BEQ SVY
  804.           LDA #'0'
  805.           INY
  806.           STA STACK-1,Y
  807. SVY       STY STRNG2
  808. MAKSTR    LDY #0         ;Zero in on # while
  809.           LDX #$80       ; building string.
  810. MSLUP     LDA FAC+4
  811.           CLC
  812.           ADC DECTBL+3,Y
  813.           STA FAC+4
  814.           LDA FAC+3
  815.           ADC DECTBL+2,Y
  816.           STA FAC+3
  817.           LDA FAC+2
  818.           ADC DECTBL+1,Y
  819.           STA FAC+2
  820.           LDA FAC+1
  821.           ADC DECTBL,Y
  822.           STA FAC+1
  823.           INX            ;Count in X
  824.           BCS PARITY?    ;Continue add/subt if
  825.           BPL MSLUP      ; dec # pos & carry clear or
  826.           BMI COUNTED
  827. PARITY?   BMI MSLUP      ; dec # neg & carry set.
  828. COUNTED   TXA
  829.           BCC MAKDIGIT
  830.           EOR #$FF       ;Adjust count for case
  831.           ADC #10        ; of positive dec #
  832. MAKDIGIT  ADC #'0'-1     ;Convert count to ascii digit
  833.           LUP 4
  834.           INY
  835.           --^
  836.           STY VARPNT     ;Save ptr to DECTBL
  837.           LDY STRNG2     ;Get ptr to string
  838.           INY
  839.           TAX
  840.           AND #$7F
  841.           STA STACK-1,Y
  842.           DEC TMPEXP     ;Shift decimal point
  843.           BNE SAVY
  844.           LDA #'.'       ;Insert it at proper location
  845.           INY
  846.           STA STACK-1,Y
  847. SAVY      STY STRNG2     ;Save string ptr
  848.           LDY VARPNT     ;Get DECTBL ptr
  849.           TXA
  850.           EOR #$FF       ;Toggle sign of X-reg
  851.           AND #$80
  852.           TAX
  853.           CPY #TEND-DECTBL
  854.           BNE MSLUP      ;Loop till done
  855.           LDY STRNG2
  856. MVBACK    LDA STACK-1,Y
  857.           DEY
  858.           CMP #'0'       ;Suppress trailing 0's
  859.           BEQ MVBACK
  860.           CMP #'.'       ;If ends in DP, write over it
  861.           BEQ NEEDEX?
  862.           INY
  863. NEEDEX?   LDA #'+'
  864.           LDX EXPON
  865.           BEQ MARKEND    ;Branch if no exp
  866.           BPL PUTEX      ;Branch if + exp
  867.           LDA #0
  868.           SEC
  869.           SBC EXPON      ;Negate it
  870.           TAX
  871.           LDA #'-'
  872. PUTEX     STA STACK+1,Y
  873.           LDA #'E'
  874.           STA STACK,Y
  875.           TXA            ;Exp to A
  876.           LDX #'0'-1     ;Use X to count ASCII exp high
  877.           SEC
  878. WHATX     INX
  879.           SBC #10        ;Divide by 10
  880.           BCS WHATX
  881.           ADC #'0'+10    ;Adjust remainder
  882.           STA STACK+3,Y  ; = ASCII exp low
  883.           TXA            ;Get quotient
  884.           STA STACK+2,Y  ; = ASCII exp high
  885.           LDA #0
  886.           STA STACK+4,Y  ;Mark end
  887.           BEQ PNTSTK
  888. WNDUP     STA STACK-1,Y
  889. MARKEND   LDA #0
  890.           STA STACK,Y
  891. PNTSTK    LDA #<STACK
  892.           LDY #>STACK
  893.           RTS
  894.  
  895. HALF      HEX 8000000000
  896.  
  897. * 32 bit hex reps of powers of 10:
  898.  
  899. DECTBL    HEX FA0A1F00   ;-100000000
  900.           HEX 00989680   ;10000000
  901.           HEX FFF0BDC0   ;-1000000
  902.           HEX 000186A0   ;100000
  903.           HEX FFFFD8F0   ;-10000
  904.           HEX 000003E8   ;1000
  905.           HEX FFFFFF9C   ;-100
  906.           HEX 0000000A   ;10
  907.           HEX FFFFFFFF   ;-1
  908.  
  909. TEND      = *
  910.  
  911. SQR       JSR MOVAF      ;Compute as 1/2 power
  912.           LDA #HALF
  913.           LDY #>HALF
  914.           JSR MOVFM      ;Put 1/2 in FAC
  915.  
  916. FPWRT     BEQ EXP        ;ARG^FAC -> FAC
  917.           LDA ARG
  918.           BNE PW1
  919.           JMP AtoFAC     ;Set FAC=0 if ARG=0
  920.  
  921. PW1       LDX #TEMP3
  922.           LDY #0
  923.           JSR MOVMF      ;Store at TEMP3
  924.           LDA ARGSGN
  925.           BPL PW2        ;Branch if argument is +
  926.           JSR INT        ;Get INT part of exponent
  927.           LDA #TEMP3
  928.           LDY #0
  929.           JSR FCOMP      ;Is it an integer power?
  930.           BNE PW2
  931.           TYA            ;If so, allow neg argument
  932.           LDY CHARAC     ;Get parity (from INT)
  933. PW2       JSR MFA        ;Move argument to FAC
  934.           TYA            ;Least signif bit can be set
  935.           PHA            ; only from the LDY CHARAC
  936.           JSR LOG        ;Get LOG(argument)
  937.           LDA #TEMP3
  938.           LDY #0
  939.           JSR FMULT      ;Compute expon*LOG(argum)
  940.           JSR EXP        ;Raise to e-th power
  941.           PLA            ;Was exponent a negative
  942.           LSR            ; odd integer?
  943.           BCC RTN13      ;Return if not
  944. NEGOP     LDA FAC        ;Is result 0?
  945.           BEQ RTN13      ;Return if so
  946.           >>> NEG.FACSGN
  947. RTN13     RTS
  948.  
  949. * The values indicated here are not exact since
  950. * the coefficients are adjusted for accuracy:
  951.  
  952. LOGe      HEX 8138AA3B29 ;LOG(e) to base 2
  953. EXPSER    DFB 7          ;Index to # of coefs:
  954.           HEX 7134583E56 ;(log(2)^7)/7!
  955.           HEX 74167EB31B ;(log(2)^6)/6!
  956.           HEX 772FEEE385 ;(log(2)^5)/5!
  957.           HEX 7A1D841C2A ;(log(2)^4)/4!
  958.           HEX 7C6359580A ;(log(2)^3)/3!
  959.           HEX 7E75FDE7C6 ;(log(2)^2)/2!
  960.           HEX 8031721810 ;log(2)
  961.           HEX 8100000000 ;1
  962.  
  963. * Because of bug in FMULT, EXP(x) is off for aprox.
  964. * 1 < x@< 1.00000012 and many other valuesL [eg.,#~p[:[isy i@|iR:"Z<Vo{/too l/ ||o7lf integer, etc.]
  965.  
  966. EXP       LDA #LOGe      ; e^FAC -> FAC
  967.           LDY #>LOGe
  968.           JSR FMULT      ;Set up to compute as 2^(xLOG(e))
  969.           LDA EXTRAFAC
  970.           ADC #$50
  971.           BCC X1
  972.           JSR ROUND
  973. X1        STA EXTRASV
  974.           JSR MAF        ;Copy to ARG
  975.           LDA FAC
  976.           CMP #$88       ;Within range?
  977.           BCC X2         ;Branch if not
  978. OOR       JSR OUTOFRNG   ;Make zero or overflow
  979. X2        JSR INT        ;Get integer part in FAC
  980.           LDA CHARAo. CLC
  981.           +GX=
  982. 8!lgq5Uw5
  983. n~Rx[R<(x"6_[QN0i]k(
  984. kPi}0l0Y)WRDX #5
  985. X3        LDA ARG,X      ;Swap ARG and FAC
  986.           LDY FAC,X
  987.           STA FAC,X
  988.           STY ARG,X
  989.           DEX
  990.           BPL X3
  991.           LDA EXTRASV
  992.           STA EXTRAFAC
  993.           JSR FSUBT      ;Subtract off integer part
  994.           JSR NEGOP
  995.           LDA #EXPSER
  996.           LDY #>EXPSER
  997.           JSR SERIES     ;Use series on frac. part
  998.           LDA #0
  999.           STA SGNCPR
  1000.           PLA
  1001.           JSR ADEX2      ;Add exponent of int. part
  1002.           RTS
  1003.  
  1004. ODDSER    STA SERPNT     ;Computes ax+bx^3+cx^5+...
  1005.           STY SERPNT+1   ; where SERPNT points to
  1006.           JSR MOV1F      ; coef ...c,b,a.
  1007.           LDA #TEMP1     ; # of coef = SERLEN+1
  1008.           JSR FMULT      ;Square x
  1009.           JSR SERMAIN    ;Do series in x^2
  1010.           LDA #TEMP1     ;Get x again
  1011.           LDY #0
  1012.           JMP FMULT      ;Multiply by series and exit
  1013.  
  1014. SERIES    STA SERPNT     ;Computes a+bx+cx^2+...
  1015.           STY SERPNT+1   ; where SERPNT points to
  1016. SERMAIN   JSR MOV2F      ; coef ...c,b,a.
  1017.           LDA (SERPNT),Y
  1018.           STA SERLEN     ;Set up SERLEN from table start
  1019.           LDY SERPNT     ; and point SERPNT to last coef
  1020.           INY            ; (which comes first in table).
  1021.           TYA
  1022.           BNE SS
  1023.           INC SERPNT+1
  1024. SS        STA SERP:T
  1025.           LDY SERPNT+1
  1026. SERLOOP   #8PFMULT
  1027.           LDA SERPNT
  1028.           LDY SERlp1
  1029.           CLC
  1030.           ADC #5         ;Move SERPNT to next coef
  1031.           BCC NXTERM
  1032.           INY
  1033. NXTERM    STA SERPNT
  1034.           STY SERPNT+1
  1035.           JSR FADD       ;Add next coef
  1036.           LDA #TEMP2     ;Get x again
  1037.           LDY #0
  1038.           DEC SERLEN
  1039.           BNE SERLOOP    ;Loop till done
  1040. RTN14     RTS
  1041.  
  1042. RNDADJ1   HEX 9835447A   ;The "missing" 5th bytes here
  1043. RNDADJ2   HEX 6828B146   ; account for known RND bug.
  1044.  
  1045. RND       JSR SIGN       ;Get sign of argument
  1046.           TAX            ;Remember it
  1047.           BMI RD1        ;If - use current FAC
  1048.           LDA #RNDSEED
  1049.           LDY #0         ;Move current seed to FAC
  1050.           JSR MOVFM
  1051.           TXA            ;Recall sign
  1052.           BEQ RTN14      ;Exit now if RND(0)
  1053.           LDA #RNDADJ1   ;Mix it up
  1054.           LDY #>RNDADJ1
  1055.           JSR FMULT
  1056.           LDA #RNDADJ2   ;More mixing
  1057.           LDY #>RNDADJ2
  1058.           JSR FADD
  1059. RD1       LDX FAC+4      ;Still more
  1060.           LDA FAC+1      ;(Interchange least and
  1061.           STA FAC+4      ; most significant bytes.)
  1062.           STX FAC+1
  1063.           LDA #0
  1064.           STA FACSGN     ;Take abs val
  1065.           LDA FAC
  1066.           STA EXTRAFAC   ;Set up extra bit "randomly"
  1067.           LDA #$80       ;Adjust to range 0-1
  1068.           STA FAC
  1069.           JSR SIGNIF     ;Normalize it
  1070.           LDX #RNDSEED   ;Move FAC to rnd seed
  1071.           LDY #0
  1072. RD2       JMP MOVMF
  1073.  
  1074. * Because of bug in FMULT, COS(x) is off for approx.
  1075. * -.000000184 < x < .000000184, X not 0, and many
  1076. * other values.
  1077.  
  1078. COS       LDA #PIhalf    ;Cos(x)=sin(x + pi/2)
  1079.           LDY #>PIhalf
  1080.           JSR FADD
  1081.  
  1082. * SIN(x) is off for x near pi/2 (but not = pi/2)
  1083. * and many other places.
  1084.  
  1085. SIN       JSR MOVAF      ;Copy FAC to ARG
  1086.           LDA #PIdoub
  1087.           LDY #>PIdoub
  1088.           LDX ARGSGN
  1089.           JSR DIV        ;Divide by 2pi
  1090.           JSR MOKt      ;Copy to ARG
  1091.           JSR INT        ;Take integer part
  1092.           LDA #0         ;Does sZ.hing
  1093.           STA SGNCPR     ; ?<zJSR FSUBT ;Subtract to get mod(2pi)
  1094.           LDA= UARTER
  1095.           LDY #>QUARTER
  1096.           JSR FSUB=xonvert argument to 1st quad
  1097.           LDA FACSGN     ; range 0 to 1/4 as
  1098.           PHA            ; multiples of 2pi
  1099.           BPL SI1
  1100.           JSR FADDH
  1101.           LDA FACSGN
  1102.           BMI SI2
  1103.           >>> NEG.SIGNFLG
  1104. SI1       JSR NEGOP
  1105. SI2       LDA #QUARTER
  1106.           LDY #>QUARTER
  1107.           JSR FADD
  1108.           PLA
  1109.           BPL SI3
  1110.           JSR NEGOP
  1111. SI3       LDA #SINS2g    ;Do stanac/ sin series
  1112.           LDY #>SINSER
  1113.           JMP ODDSER
  1114.  
  1115. TAN       JSR MOV1F      ;Save FAC in TEMP1
  1116.           LDA #0
  1117.           STA SIGNFLG
  1118.           JSR SIN
  1119.           LDX #TEMP3
  1120.           LDY #0         ;Store sin at TEMP3
  1121.           JSR RD2
  1122.           LDA #TEMP1
  1123.           LDY #0
  1124.           JSR MOVFM      ;Retrieve FAC
  1125.           LDA #0         ; and compute cos
  1126.           STA FACSGN
  1127.           LDA SIGNFLG
  1128.           JSR TAN2
  1129.           LDA #TEMP3     ;Retrieve sin
  1130.           LDY #0
  1131.           JMP FDIV       ; and divide
  1132.  
  1133. TAN2      PHA
  1134.           JMP SI1
  1135.  
  1136. PIhalf    HEX 81490FDAA2
  1137. PIdoub    HEX 83490FDAA2
  1138. QUARTER   HEX 7F00000000
  1139.  
  1140. * These coefficients dVHUD4 UX/cc cI\~t)%gf
  1141. |,Pv`7%\j % ,Y?uBfCMo
  1142. v%`c&?TMQ4qC:+?Z~
  1143. JX=eh[2/
  1144. wSAg@862807FBF8         ;(2pi)^9/9!
  1145.           HEX 8799688901 ;(2pi)^7/7!
  1146.           HEX 872335DFE1 ;(2pi)^5/5!
  1147.           HEX 86A55DE728 ;(2pi)^3/3!
  1148.           HEX 83490FDAA2 ;2pi
  1149.           HEX A6D3C1C8D4 ;Does not appear used
  1150.           HEX C8D5C4CECA ;"
  1151.  
  1152. ATN       LDA FACSGN     ;A modified Gregory series
  1153.           PHA            ; is used here.  (Gregory
  1154.           BPL ATN1       ; converges too slowly)
  1155.           JSR NEGOP
  1156. ATN1      LDA FAC
  1157.           PHA
  1158.           CMP #$81       ;Normalize between 0 & 1
  1159.           BCC ATN2
  1160.           LDA #ONE
  1161.           LDY #>ONE
  1162.           JSR FDIV
  1163. ATN2      LDA #ATNSER
  1164.           LDY #>ATNSER
  1165.           JSR ODDSER
  1166.           PLA
  1167.           CMP #$81
  1168.           BFC ATM3
  1169.           LDA #PIhalf
  1170.           LDY #>PIhalf
  1171.           JSR%?B}[l(0*V.Dxah@U_bY.{+ pFatioD#TN3 PLA
  1172.           BPL RTN15
  1173.           JMP NEGOP
  1174. RTN15     RTS
  1175.  
  1176. ATNSER    DFB 11         ;Index to # of coefs:
  1177.           HEX 76B383BDD3
  1178.           HEX 791EF4A6F5
  1179.           HEX 7B83FCB010
  1180.           HEX 7C0C1F67CA
  1181.           HEX 7CDE53CBC1
  1182.           HEX 7D1464704C
  1183.           HEX 7DB7EA517A
  1184.           HEX 7D6330887E
  1185.           HEX 7E9244993A
  1186.           HEX 7E4CCC91C7
  1187.           HEX 7FAAAAAA13
  1188.           HEX 8100000000
  1189.  
  1190. * CHRGET routine (and RND seed)
  1191. * to be placed at $B1 on zero page.
  1192.  
  1193. ZPSTUFF   >>> INCR.TXTPTR
  1194.           LDA $EA60      ;Address of no importance
  1195.           CMP #':'       ;Return carry set if not #
  1196.           BCS RTN16      ;Z-flag set if ':' or eol
  1197.           CMP #' '       ;Skip spaces
  1198.           BEQ ZPSTUFF
  1199.           SEC
  1200.           SBC #'0'       ;This code clears carry if
  1201.           SEC            ; numeric, sets it if not,
  1202.           SBC #$100-'0'  ; and leaves A-reg as found
  1203. RTN16     RTS
  1204.  
  1205.           HEX 804FC75258 ;Random number seed
  1206.  
  1207. COLDST    LDX #$FF
  1208.           STX CURLIN+1   ;Init direct mode
  1209.           LDX #$FB       ; and stack pointer.
  1210.           TXS            ;Upper 4 bytes of stack used for
  1211.                          ; link and line # in line input.
  1212.           LDA #COLDST
  1213.           LDY #>COLDST
  1214.           STA GOWARM+1   ;Why? These changed later!
  1215.           STY GOWARM+2
  1216.           STA GOSTROUT+1
  1217.           STY GOSTROUT+2
  1218.           JSR NORMAL     ;Init normal text
  1219.           LDA #$4C       ;Set up =zmp locations
  1220.           STA GOWARM
  1221.           STA GOSTROUT
  1222.           STA JMPADRS
  1223.           STA USR        ;USR adrs inited
  1224.           LDA #IQERR     ; to illegal quantity
  1225.           LDY #>IQERR    ; error routine.
  1226.           STA USR+1
  1227.           STY USR+2
  1228.           LDX #$1C       ;Should be $1D?
  1229. MVZP      LDA ZPSTUFF-1,X
  1230.           STA CHRGET-1,X
  1231.           STX SPEEDZ     ;Init SPEED to 255)(SPEEDZ = 1)
  1232.           DEX
  1233.           BNE MVZP
  1234.           STX TRCFLG     ;Set NOTRACE
  1235.           TXA
  1236.           STA FPGEN      ;Holds 0 except in INT routine
  1237.           STA LASTPT+1   ;ALWAYS holds 0
  1238.           PHA            ;Put 0 at $1FB, (not used!)
  1239.           LDA #3         ;Init DSCLEN to value
  1240.           STA DSCLEN     ; expected by GARBAG
  1241.           JSR CRDO
  1242.           LDA #1         ;Set up fake
  1243.           STA IN-3       ; link of $101
  1244.           STA IN-4
  1245.           LDX #$55       ;Init index to temp
  1246.           STX TEMPPT     ; string descriptors
  1247.           LDA #0
  1248.           LDY #8
  1249.           STA LINNUM
  1250.           STY LINNUM+1
  1251.           LDY #0
  1252. FNDMEMHI  INC LINNUM+1   ;Test first byte of each page
  1253.           LDA (LINNUM),Y
  1254.           EOR #$FF       ; until ROM or empty location
  1255.           STA (LINNUM),Y ; is found.
  1256.           CMP (LINNUM),Y
  1257.           BNE MEMFOUND
  1258.           EOR #$FF       ;Put back as found
  1259.           STA (LINNUM),Y
  1260.           CMP (LINNUM),Y ;Test again to make sure
  1261.           BEQ FNDMEMHI
  1262. MEMFOUND  LDY LINNUM
  1263.           LDA LINNUM+1
  1264.           AND #$F0       ;Make sure it is a multiple
  1265.           STY MEMSIZ     ; of 4K in case test faulty.
  1266.           STA MEMSIZ+1
  1267.           STY FRETOP
  1268.           STA FRETOP+1
  1269.           LDX #0         ;Set program pointer
  1270.           LDY #8         ; to $800.
  1271.           STX TXTTAB
  1272.           STY TXTTAB+1
  1273.           LDY #0
  1274.           STY LOCK       ;Init lock byte and
  1275.           TYA
  1276.           STA (TXTTAB),Y ; program beginning byte.
  1277.           >>> INCR.TXTTAB
  1278.           LDA TXTTAB
  1279.           LDY TXTTAB+1
  1280.           JSR REASON
  1281.           JSR SCRTCH
  1282.  
  1283. * Now frustrate machine language programmers by
  1284. * wasting the prime real estate at 0-5:
  1285.  
  1286.           LDA #STROUT
  1287.           LDY #>STROUT
  1288.           STA GOSTROUT+1 ;Afterthought?
  1289.           STY GOSTROUT+2
  1290.           LDA #RESTART
  1291.           LDY #>RESTART
  1292.           STA GOWARM+1
  1293.           STY GOWARM+2
  1294.           JMP (GOWARM+1)
  1295.